﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using System.Xml;

namespace GameVLTK
{
    public class SkillA : Skill
    {
        #region Thuộc tính
        //Hướng di chuyển của Skill
        private int _PrevDirection;

        public int PrevDirection
        {
            get { return _PrevDirection; }
            set { _PrevDirection = value; }
        }

        private int _CurrentDirection;

        public int CurrentDirection
        {
            get { return _CurrentDirection; }
            set { 
                _CurrentDirection = value;
                //Hướng thay đổi phải tính lại dãy frame
                if (_CurrentDirection != _PrevDirection)
                {
                    ReCalcFrameSeq();
                }
            }
        }

        public override int nTextures
        {
          get { return _nTextures; }
          set { 
              _nTextures = value;
              _nFrames = _nTextures / Global.NUM_OF_DIRECTIONS;
          }
        }

        private int _nFrames;

        public int nFrames
        {
            get { return _nFrames; }
            set { _nFrames = value; }
        }

        //Khi sử dụng Skill thì Player sẽ mất đi nội lực
        private int _Mana;

        public int Mana
        {
            get { return _Mana; }
            set { _Mana = value; }
        }

        private int[,] VELOCITIES = { { 0, 5},{ -5, 5}, { -5, 0}, { -5, -5 }, 
                                   { 0 , -5 }, { 5, -5 }, { 5, 0 }, { 5, 5 } };

        #endregion
        /// <summary>
        /// Khởi tạo thông tin của vật phẩm
        /// </summary>
        public SkillA(ContentManager content, string path, int nTextures):base(content,path,nTextures)
        {
            //
            this.Content = content;
            this.Path = path;
            this.nTextures= nTextures;
            //


            Texture2D[] textures;
            textures = new Texture2D[nTextures];

            int[] framSeq = new int[nTextures];
            for (int i = 0; i < nTextures; i++)
            {
                textures[i] = content.Load<Texture2D>(path + (i + 1).ToString("00"));
                framSeq[i] = i;
            }

            //Mỗi obj sẽ có một sprite gồm dãy các hình
            this.Sprites = new List<MySprite>();
            this.nSprites = 1;
           
            
            //Khởi tạo sprite cho obj
            MySprite mySprite = new MySprite(textures, new Vector2(0,0));
            mySprite.FrameSequence = framSeq;

            this.Sprites.Add(mySprite);

            //Skill hiện tại không được sử dụng
            this.IsSkillActive = false;

            this.PrevDirection = -1;
            this.CurrentDirection = -1;
        }


        public override void Update(GameTime gameTime)
        {
            if (this.IsSkillActive)
            {
                //Tính tọa độ di chuyển dựa vào hướng sẽ di chuyển
                float x = VELOCITIES[this.CurrentDirection, 0];
                float y = VELOCITIES[this.CurrentDirection, 1];

                this.TopLeft += new Vector2(x, y);

                //Kiểm tra collision giữa Skill và danh sách Killers
                CheckCollision();

                //Trường hợp Skill đã chuyển động ra khỏi màn hình
                if (this.TopLeft.X > Global.SCREEN_WIDTH || this.TopLeft.X< 0 ||
                    this.TopLeft.Y > Global.SCREEN_HEIGHT || this.TopLeft.Y< 0)
                {
                    this.IsSkillActive = false;
                    Map.Player.IsSkillActive = false;
                }

                base.Update(gameTime);
            }
        }

        /// <summary>
        /// Kiểm tra collision giữa Skill với Killer
        /// </summary>
        private void CheckCollision()
        {
            for (int i= 0; i< Map.Killers.Killers.Count; i++)
             if (Global.IsCollisioned(this,Map.Killers.Killers.ElementAt(i)))
             {
                 //Tạo hiệu ứng khi va chạm của skill

                 //Giảm lượng máu của Killer xuống
                 GameEntity[]gameEnities= new GameEntity[1];
                 gameEnities[0]= Map.Killers.Killers.ElementAt(i);
                 Global.BroadCastEvents(Global.EVENTS.GM_Killer_COLLISION_SKILL,
                        this, null, gameEnities);

                 //Cho skill biến mất
                 this.IsSkillActive= false;
                 Map.Player.IsSkillActive= false;

                 break;
             }
        }

     

        public override int OnEvent(Global.EVENTS eventID, object sender, object[] args)
        {
            return base.OnEvent(eventID, sender, args);
        }


        /// <summary>
        /// 
        /// </summary>
        public override VisibleGameEntity Clone()
        {

            Skill skill = new SkillA(this.Content,
                                            this.Path,
                                            this.nTextures);
            return skill;
        }


        /// <summary>
        /// Tính toán dãy frame di chuyển cho trạng thái và hướng hiện tại
        /// </summary>
        /// <returns></returns>
        private int[] CalcFrameSeq()
        {
            int[] frameSequence = new int[this.nFrames];
            int j = 0;
            int lengOfSeqFrameCurrDir = this.CurrentDirection * this.nFrames +
                                                          this.nFrames;

            for (int i = this.CurrentDirection * this.nFrames; i < lengOfSeqFrameCurrDir; i++)
            {
                frameSequence[j] = i;
                j = j + 1;
            }

            return frameSequence;
        }

        /// <summary>
        /// Tính toán lại dãy frame và cập nhật lại size cho nhân vật
        /// </summary>
        private void ReCalcFrameSeq()
        {
            //Tính toán dãy frame
            this.Sprites[0].FrameSequence = this.CalcFrameSeq();

            //Cho biết chỉ số bắt đầu của frame của trạng thái hiện tại
            int beginSeq = this.Sprites[0].FrameSequence[0];

            //Tính toán lại kích thước nhân vật với hướng di chuyển hiện tại
            //Cái này tính bị sai cho kích thước mỗi frame trong dãy frame là hoàn toàn
            //khác nhau.
            this.Size = new Vector2(this.Sprites[0].Textures[beginSeq].Width,
                     this.Sprites[0].Textures[beginSeq].Height);
        }


    

      
    }
}
